package com.cskaoyan._09override._02override;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/9 17:15
 **/
/*
@override 用来标记或检测这个方法是不重写父类的方法

语法:
    // 成员方法的语法
    [访问权限修饰符] 返回值类型 方法名(形参列表){
     //方法体
    }
说明:
    1.对于权限修饰符来说,子类重写父类的方法的时候,修饰符跟父类保持一致或者更为宽松
    2.对于返回值类型来说,子类重写父类的方法的时候.返回值类型跟父类保持一致或者兼容
    兼容:对于基本数据类型来说要一致,
    对于引用数据类型来说可以兼容,能够自动类型转换(向上转型)
    3.方法名重写的时候必须一样
    4.形参列表必须一样
    5.方法体里无所谓

方法重载(Overload) VS 方法的重写(Override)一定要会,看笔记的图片

注意事项:
- 父类中私有方法不能被重写（因为没有权限访问，更不谈重写）
- 静态方法在使用现象上，很像是被重写了，但实际上静态方法不能被重写，
而是直接是一个新的静态成员。（使用`@Override`注解标记会报错）
- 构造器不能继承，更不能被重写。
- 快捷方式：
  - 直接在子类中，手写出父类方法的名字。看到出现父类方法提示，直接回车即可重写。
  - 使用快捷键`Alt + Insert`，在选项`Override Methods`中，选择重写子类的方法。

 */
public class Demo {
    public static void main(String[] args) {

    }
}

class Father{
    public void func() {
        System.out.println("father func");
    }

    void m1() {

    }

    // 有返回值的方法
    public Fruit m2() {

        return new Fruit();
    }

    // 定义一个静态的方法
    public static void m3() {

    }

    // private方法
    private void m4() {

    }

}

class Son extends Father {

    // 快捷方式--> 直接在子类中写跟父类同名的方法名 直接回车
    //@Override
    //public void func() {
    //    super.func();
    //}

    // 快捷键alt+enter 选择重写方法

    @Override
    public void func() {
        super.func();
    }
// 'm1()' in 'com.cskaoyan._09override._02override.Son' clashes with 'm1()' in 'com.cskaoyan._09override._02override.Father'; attempting to assign weaker access privileges ('private'); was 'packageLocal'
    // 修饰符跟父类保持一致或者更为宽松
    //@Override
    //private void m1() {
    //    super.m1();
    //}


    @Override
    public Apple m2() {
        return new Apple();
    }

    // 静态的方法就不是重写
    //@Override
    //public static void m3() {
    //
    //}

    //@Override
    //public void m4() {
    //
    //}

}

class Fruit{

}

class Apple extends Fruit{

}